'use strict'

process.chdir(__dirname);

const titbit=require('titbit');
const fs=require('fs');
//引入数据库
const pg=require("pg");
const dbconfig=require("./dbconfig.js");
const wxkey=require('./wxkey.js');
let token=require('titbit-token');
//使用HTTP/1.1的客户端
const {httpcli}=require('gohttp');

//初始化数据库连接
let psql = new pg.Pool(dbconfig);


let tok=new token({
    //token有效期，单位是秒
    expires:30,
    //必须是32位字母数字
    key:'1qaz2wasdfghjklkjhgfdsaqwertyuio',
    //必须是16位字母数字
    iv:'9io08u7y6t5r4e3w'
})


try{
    fs.accessSync('./images')
}catch(err){
    fs.mkdirSync('./images')
}

let cert_path='/usr/local/share'

const app=new titbit({
    //开启调试模式，会输出错误信息
    debug:true,
    globalLog:true,//全局日志
    // http2:true
    cert:`${cert_path}/wx.xxmtcds.top.pem`,
    key:`${cert_path}/wx.xxmtcds.top.key`,
})

//c就是context
app.get('/',async c=>{
    c.send('ok');
})

/**—————————————content路由——————————————————— */

app.get('/content',async c=>{
    let sqltext='SELECT id,title,update_time FROM content'
    let r = await psql.query(sqltext); 

    c.send(r.rows);
    
})

app.post('/content',async c=>{
    try{
        //c.body时提交的请求体数据
        let data=JSON.parse(c.body);
        let sqltext='INSERT INTO content'
        +'(id,detail,title,add_time,update_time)'
        + ' VALUES ($1, $2, $3, $4, $5)';
         //随机数转成16进制字符串并去掉前两位
         let id=Math.random().toString(16).substring(2);
         let tm=Date.now();

         let r=await psql.query(sqltext,[
             id,data.detail,data.title,tm,tm
         ])
         if(r.rowCount===0){
             return c.status(500).send('failed');
         }

         c.send(id);

    }catch(err){
        console.error(err);
        c.status(400).send('bad data');
    }
})

app.get('/content/:id',async c=>{

    let id=c.param.id

    let sqltext='SELECT id,detail,title,update_time ' 
    + ' FROM content WHERE id=$1';

    let r=await psql.query(sqltext,[ id ])
    if(r.rowCount===0){return c.status(404).send('not found')};

    c.send(r.rows[0]);
})

app.delete('/content/:id',async c=>{ 
    let id=c.param.id

    let sqltext=`DELETE FROM content WHERE id=$1`;

    let r=await psql.query(sqltext,[ id ])

    c.send({
        count:r.rowCount
    })

})


//小程序中有一个删除函数



/**—————————————content路由 -END——————————————————— */

app.get('/upload',async c=>{
    //c.helper是助手函数模块，其中有对stream.pipe的封装
    //c.reply是响应对象，http/1.1中指向response，http/2中指向stream
    await c.helper.pipe('./upload.html',c.reply);

});
app.post('/upload',async c=>{
    let f=c.getFile('file');

    if(!f){
        return c.status(400).send('file not found')
    }

    //生成唯一文件名
    let fname=c.helper.makeName(f.filename);

    try{
        await c.moveFile(f,`./images/${fname}`);
        c.send(fname);
    }catch(err){
        c.status(500).send('failed');
    }
});
//JS无需加分号，谁用谁知道
//有时也得加分号，括号开头很需要
// ;(async()=>{})();


//:开头 表示带参数的请求，动态的
app.get('/images/:name',async c=>{
    let imgname=c.param.name;

    try{ 
        await c.helper.pipe(`./images/${imgname}`,c.reply);
    }catch(err){
        c.status(404).send('image not found');
    }
});

app.get('/user/:name/:age/:mobile',async c=>{
    console.log(c.param)
    c.send(c.param)
})


app.get('/mp-login/:code',async c=>{
    // c.send(c.param)
    let auth_url=`https://api.weixin.qq.com/sns/jscode2session`
        +`?appid=${wxkey.appid}`
        +`&secret=${wxkey.secret}`
        +`&js_code=${c.param.code}`
        +`&grant_type=authorization_code`


    let ret=await httpcli.get(auth_url)
        .then(res=>{
            // return res.text()
            return res.json()
        })

    // c.send(ret)
    c.send(tok.make(ret));
})








//监听1234端口运行服务
app.run(2222);

